home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / bench.c < prev    next >
C/C++ Source or Header  |  1995-11-08  |  12KB  |  361 lines

  1. /* pop (%!) .skipeof */
  2. /* Copyright (C) 1989, 1995 Aladdin Enterprises.  All rights reserved.
  3.   
  4.   This file is part of Aladdin Ghostscript.
  5.   
  6.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  7.   or distributor accepts any responsibility for the consequences of using it,
  8.   or for whether it serves any particular purpose or works at all, unless he
  9.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  10.   License (the "License") for full details.
  11.   
  12.   Every copy of Aladdin Ghostscript must include a copy of the License,
  13.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  14.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  15.   under certain conditions described in the License.  Among other things, the
  16.   License requires that the copyright notice and this notice be preserved on
  17.   all copies.
  18. */
  19.  
  20. /* bench.c */
  21. /* Simple hardware benchmarking suite (C and PostScript) */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24.  
  25. /*
  26.  * Read the CPU time (in seconds since an implementation-defined epoch)
  27.  * into ptm[0], and fraction (in nanoseconds) into ptm[1].
  28.  */
  29. extern void gp_get_usertime(long ptm[2]);
  30.  
  31. /* Patchup for GS externals */
  32. FILE *gs_stdout;
  33. FILE *gs_stderr;
  34. const char gp_scratch_file_name_prefix[] = "gs_";
  35. void gp_init_console() { }
  36. FILE *gp_open_scratch_file(const char *prefix, char *fname, const char *mode)
  37. { return NULL; }
  38. void gp_set_printer_binary(int prnfno, int binary) { }
  39. void gs_exit(n)
  40. { exit(n); }
  41. void lprintf_file_and_line(FILE *f, const char *file, int line)
  42. { fprintf(f, "%s(%d): ", file, line); }
  43.  
  44. /* Loop unrolling macros */
  45. #define do10(x) x;x;x;x;x; x;x;x;x;x
  46.  
  47. /* Define the actual benchmarks. */
  48. static int
  49. iadd(int a, int n, char **msg)
  50. {    int b = 0, i;
  51.     for ( i = n / 20; --i >= 0; ) { do10((b += a, b += i)); }
  52.     *msg = "integer adds";
  53.     return b;
  54. }
  55. static int
  56. imul(int a, int n, char **msg)
  57. {    int b = 1, i;
  58.     for ( i = n / 20; --i > 0; ) { do10((b *= a, b *= i)); }
  59.     *msg = "integer multiplies";
  60.     return b;
  61. }
  62. static int
  63. idiv(int a, int n, char **msg)
  64. {    int b = 1, i;
  65.     for ( i = n / 20; --i > 0; ) { b += 999999; do10((b /= a, b /= i)); }
  66.     *msg = "integer divides";
  67.     return b;
  68. }
  69. static int
  70. fadd(float a, int n, char **msg)
  71. {    float b = 0;
  72.     int i;
  73.     for ( i = n / 10; --i >= 0; ) { do10((b += a)); }
  74.     *msg = "floating adds";
  75.     return b;
  76. }
  77. static int
  78. fmul(float a, int n, char **msg)
  79. {    float b = 1;
  80.     int i;
  81.     for ( i = n / 10; --i >= 0; ) { do10((b *= a)); }
  82.     *msg = "floating multiplies";
  83.     return b;
  84. }
  85. static int
  86. fdiv(float a, int n, char **msg)
  87. {    float b = 1;
  88.     int i;
  89.     for ( i = n / 10; --i >= 0; ) { do10((b /= a)); }
  90.     *msg = "floating divides";
  91.     return b;
  92. }
  93. static int
  94. fconv(int a, int n, char **msg)
  95. {    int b[10];
  96.     float f[10];
  97.     int i;
  98.     b[0] = a;
  99.     for ( i = n / 20; --i >= 0; )
  100.       f[0] = b[0], f[1] = b[1], f[2] = b[2], f[3] = b[3], f[4] = b[4],
  101.       f[5] = b[5], f[6] = b[6], f[7] = b[7], f[8] = b[8], f[9] = b[9],
  102.       b[0] = f[1], b[1] = f[2], b[2] = f[3], b[3] = f[4], b[4] = f[5],
  103.       b[5] = f[6], b[6] = f[7], b[7] = f[8], b[8] = f[9], b[9] = f[0];
  104.     *msg = "float/int conversions";
  105.     return b[0];
  106. }
  107. static int
  108. mfast(int *m, int n, char **msg)
  109. {    int i;
  110.     m[0] = n;
  111.     for ( i = n / 20; --i >= 0; )
  112.       m[9] = m[8], m[8] = m[7], m[7] = m[6], m[6] = m[5], m[5] = m[4],
  113.       m[4] = m[3], m[3] = m[2], m[2] = m[1], m[1] = m[0], m[0] = m[9];
  114.     *msg = "fast memory accesses";
  115.     return m[0];
  116. }
  117. static int
  118. mslow(int *m, int n, char **msg)
  119. {    int *p;
  120.     int i, k = 0;
  121.     m[0] = n;
  122.     for ( i = n / 20; --i >= 0; k = (k + 397) & 0x3ffff )
  123.       p = m + k,
  124.       p[0] = p[100], p[20] = p[120], p[40] = p[140],
  125.       p[60] = p[160], p[80] = p[180],
  126.       p[200] = p[300], p[220] = p[320], p[240] = p[340],
  127.       p[260] = p[360], p[280] = p[380];
  128.     *msg = "slow memory accesses";
  129.     return m[0];
  130. }
  131.  
  132. int
  133. main(int argc, const char *argv[])
  134. {    int i;
  135.     int *mem = malloc(1100000);
  136.  
  137.     gs_stdout = stdout;
  138.     gs_stderr = stderr;
  139.     for ( i = 0; ; ++i )
  140.       { long t0[2], t1[2];
  141.         char *msg;
  142.         int n;
  143.         gp_get_usertime(t0);
  144.         switch ( i )
  145.           {
  146.           case 0: iadd(0,        n = 10000000, &msg); break;
  147.           case 1: imul(1,        n =  1000000, &msg); break;
  148.           case 2: idiv(1,        n =  1000000, &msg); break;
  149.           case 3: fadd(3.14,    n = 10000000, &msg); break;
  150.           case 4: fmul(1.0000001,    n = 10000000, &msg); break;
  151.           case 5: fdiv(1.0000001,    n =  1000000, &msg); break;
  152.           case 6: fconv(12345,    n = 10000000, &msg); break;
  153.           case 7: mfast(mem,    n = 10000000, &msg); break;
  154.           case 8: mslow(mem,    n =  1000000, &msg); break;
  155.           default: free(mem); exit(0);
  156.           }
  157.         gp_get_usertime(t1);
  158.         printf("Time for %9d %s = %g ms\n", n, msg,
  159.            (t1[0] - t0[0]) * 1000.0 + (t1[1] - t0[1]) / 1000000.0);
  160.         fflush(stdout);
  161.       }
  162. }
  163.  
  164. /*
  165.    Output from SPARCstation 10, gcc -O bench.c gp_unix.c:
  166.  
  167. Time for  10000000 integer adds = 113.502 ms
  168. Time for   1000000 integer multiplies = 467.965 ms
  169. Time for   1000000 integer divides = 594.328 ms
  170. Time for  10000000 floating adds = 641.21 ms
  171. Time for  10000000 floating multiplies = 643.357 ms
  172. Time for   1000000 floating divides = 131.995 ms
  173. Time for  10000000 float/int conversions = 602.061 ms
  174. Time for  10000000 fast memory accesses = 201.048 ms
  175. Time for   1000000 slow memory accesses = 552.606 ms
  176.  
  177.    Output from 486DX/25, wcl386 -oit bench.c gp_iwatc.c gp_msdos.c:
  178.  
  179. Time for  10000000 integer adds = 490 ms
  180. Time for   1000000 integer multiplies = 770 ms
  181. Time for   1000000 integer divides = 1860 ms
  182. Time for  10000000 floating adds = 4070 ms
  183. Time for  10000000 floating multiplies = 4450 ms
  184. Time for   1000000 floating divides = 2470 ms
  185. Time for  10000000 float/int conversions = 25650 ms
  186. Time for  10000000 fast memory accesses = 990 ms
  187. Time for   1000000 slow memory accesses = 330 ms
  188.  
  189.  */
  190.  
  191. /*
  192.    The rest of this file contains a similar benchmark in PostScript.
  193.  
  194. %!
  195. /timer        % <str> <N> <proc> timer
  196.  { bind 2 copy usertime mark 4 2 roll repeat cleartomark usertime exch sub
  197.         % Stack: str N proc dt
  198.    exch pop
  199.    (Time for ) print exch =only ( ) print exch =only (: ) print
  200.    =only ( ms
  201. ) print flush
  202.  } def
  203.  
  204. (x 20 integer adds) 5000 { 0
  205.  0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add
  206.  0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add 0 add
  207. pop } timer
  208.  
  209. (x 20 integer multiplies) 5000 { 1
  210.  3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul
  211.  3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul 3 mul
  212. pop } timer
  213.  
  214. (x 20 integer divides) 5000 { 1000000000
  215.  3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv
  216.  3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv 3 idiv
  217. pop } timer
  218.  
  219. (x 20 floating adds) 5000 { 0.0
  220. 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add
  221. 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add 1.0 add
  222. pop } timer
  223.  
  224. (x 20 floating multiplies) 5000 { 1.0
  225. 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul
  226. 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul 2.3 mul
  227. pop } timer
  228.  
  229. (x 20 floating divides) 5000 { 1.0
  230. 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div
  231. 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div 2.3 div
  232. pop } timer
  233.  
  234. (x 20 float/int conversions) 5000 { 12345.0
  235.  cvi cvr cvi cvr cvi cvr cvi cvr cvi cvr
  236.  cvi cvr cvi cvr cvi cvr cvi cvr cvi cvr
  237. pop } timer
  238.  
  239. /S 2048 string def
  240. (x 10000(byte) fast memory accesses) 1000 {
  241. //S 1024 1000 getinterval //S copy pop
  242. //S 1024 1000 getinterval //S copy pop
  243. //S 1024 1000 getinterval //S copy pop
  244. //S 1024 1000 getinterval //S copy pop
  245. //S 1024 1000 getinterval //S copy pop
  246. } timer
  247.  
  248. /A [ 500 { 2048 string } repeat ] def
  249. (x 500 x 2000(byte) slower memory accesses) 10 {
  250. 0 1 499 {
  251. //A exch get dup 1024 1000 getinterval exch copy pop
  252. } for
  253. } timer
  254.  
  255. /Times-Roman findfont 36 scalefont setfont
  256. currentcacheparams pop pop 0 1 index setcacheparams
  257. /D [4 0 0 4 0 0] 1440 1440 <00 ff> makeimagedevice def
  258. D setdevice
  259. 72 72 translate
  260. gsave 15 rotate
  261. 0 0 moveto (A) show
  262. (x 10 (A) show (cache)) 100 {
  263. 0 0 moveto
  264. (A) show (A) show (A) show (A) show (A) show
  265. (A) show (A) show (A) show (A) show (A) show
  266. } timer grestore
  267.  
  268. 0 setcachelimit
  269. gsave 10 rotate
  270. (x 10 (A) show (no cache)) 10 {
  271. 0 0 moveto
  272. (A) show (A) show (A) show (A) show (A) show
  273. (A) show (A) show (A) show (A) show (A) show
  274. } timer grestore
  275.  
  276. quit
  277.  
  278.    Results for SUN Sparc 2 (rated at 25 MIPS according to manual)
  279.  
  280. ./gs
  281. Now in gs_init.ps
  282. TextAlphaBits defined GraphicsAlphaBits defined
  283. Aladdin Ghostscript 3.50 (1995-9-24)
  284. (c) 1995 Aladdin Enterprises, Menlo Park, CA.  All rights reserved. This 
  285. software comes with NO WARRANTY: see the file PUBLIC for details. Leaving 
  286. gs_init.ps
  287. GS>(ben1.c) run
  288. Time for 5000 x 20 integer adds: 171 ms
  289. Time for 5000 x 20 integer multiplies: 504 ms
  290. Time for 5000 x 20 integer divides: 334 ms
  291. Time for 5000 x 20 floating adds: 148 ms 
  292. Time for 5000 x 20 floating multiplies: 165 ms
  293. Time for 5000 x 20 floating divides: 194 ms 
  294. Time for 5000 x 20 float/int conversions: 121 ms
  295. Time for 1000 x 10000(byte) fast memory accesses: 112 ms
  296. Time for 10 x 500 x 2000(byte) slower memory accesses: 236 ms
  297. Loading NimbusRomanNo9L-Regular font from 
  298. [...]/n021003l.gsf... 1739080 414724 2564864 1251073 0 
  299. done. Time for 100 x 10 (A) show (cache): 144 ms
  300. Time for 10 x 10 (A) show (no cache): 538 ms
  301.  
  302.    Output from SPARCstation 10, gs 3.60 compiled with gcc -g -O -DDEBUG:
  303.  
  304. gsnd bench.c
  305. Aladdin Ghostscript 3.60 (1995-10-23)
  306. Copyright (C) 1995 Aladdin Enterprises, Menlo Park, CA.  All rights reserved.
  307. This software comes with NO WARRANTY: see the file PUBLIC for details.
  308. Time for 5000 x 20 integer adds: 192 ms
  309. Time for 5000 x 20 integer multiplies: 561 ms
  310. Time for 5000 x 20 integer divides: 396 ms
  311. Time for 5000 x 20 floating adds: 202 ms
  312. Time for 5000 x 20 floating multiplies: 247 ms
  313. Time for 5000 x 20 floating divides: 243 ms
  314. Time for 5000 x 20 float/int conversions: 157 ms
  315. Time for 1000 x 10000(byte) fast memory accesses: 136 ms
  316. Time for 10 x 500 x 2000(byte) slower memory accesses: 235 ms
  317. Loading Temps-RomanSH font from /opt/home/peter/gs/fonts/soho/tersh___.pfb... 1759156 432729 2564864 1251025 0 done.
  318. Time for 100 x 10 (A) show (cache): 161 ms
  319. Time for 10 x 10 (A) show (no cache): 449 ms
  320.  
  321.    Output from 486DX/25, gs 2.6.1 compiled with wcc386 -oi[t]:
  322.  
  323. gsndt bench.c
  324. Initializing... done.
  325. Ghostscript 2.6.1 (5/28/93)
  326. Copyright (C) 1990-1993 Aladdin Enterprises, Menlo Park, CA.
  327.   All rights reserved.
  328. Ghostscript comes with NO WARRANTY: see the file COPYING for details.
  329. Time for 5000 x 20 integer adds: 550 ms
  330. Time for 5000 x 20 integer multiplies: 940 ms
  331. Time for 5000 x 20 integer divides: 880 ms
  332. Time for 5000 x 20 floating adds: 550 ms
  333. Time for 5000 x 20 floating multiplies: 660 ms
  334. Time for 5000 x 20 floating divides: 930 ms
  335. Time for 5000 x 20 float/int conversions: 830 ms
  336. Time for 1000 x 10000(byte) fast memory accesses: 660 ms
  337. Time for 10 x 500 x 2000(byte) slower memory accesses: 540 ms
  338. Loading Temps-RomanSH font from c:\gs\fonts\softhorz\tersh___.pfb... 1298792 1207949 0 done.
  339. Time for 100 x 10 (A) show (cache): 13520 ms
  340. Time for 10 x 10 (A) show (no cache): 1310 ms
  341.  
  342.    Output from 486DX/25, gs 3.52 compiled with wcc386 -oi[t]:
  343.  
  344. Aladdin Ghostscript 3.52 (1995-10-2)
  345. Copyright (c) 1995 Aladdin Enterprises, Menlo Park, CA.  All rights reserved.
  346. This software comes with NO WARRANTY: see the file PUBLIC for details.
  347. Time for 5000 x 20 integer adds: 660 ms
  348. Time for 5000 x 20 integer multiplies: 1100 ms
  349. Time for 5000 x 20 integer divides: 940 ms
  350. Time for 5000 x 20 floating adds: 710 ms
  351. Time for 5000 x 20 floating multiplies: 830 ms
  352. Time for 5000 x 20 floating divides: 1040 ms
  353. Time for 5000 x 20 float/int conversions: 820 ms
  354. Time for 1000 x 10000(byte) fast memory accesses: 660 ms
  355. Time for 10 x 500 x 1000(byte) slower memory accesses: 600 ms
  356. Loading Temps-RomanSH font from c:\gs\fonts\softhorz\tersh___.pfb... 1678548 375231 2564864 1250964 0 done.
  357. Time for 100 x 10 (A) show (cache): 2520 ms
  358. Time for 10 x 10 (A) show (no cache): 1600 ms
  359.  
  360.  */
  361.